home *** CD-ROM | disk | FTP | other *** search
/ FishMarket 1.0 / FishMarket v1.0.iso / fishies / 426-450 / disk_437 / cliwindow / cliwindow.ass < prev    next >
Text File  |  1992-05-06  |  22KB  |  690 lines

  1.  
  2.  
  3. ; ­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­
  4. ; ­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­
  5. ; ­­                                                                 ­­
  6. ; ­­                        CLIwindow V1.00                          ­­
  7. ; ­­                                                                 ­­
  8. ; ­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­
  9. ; ­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­
  10. ; ­­                                                                 ­­
  11. ; ­­         Copyright 12/1990 by    Roger Fischlin                  ­­
  12. ; ­­                                 Steigerwaldweg 6                ­­
  13. ; ­­                                 6450 Hanau 7                    ­­
  14. ; ­­                                 Germany                         ­­
  15. ; ­­                                                                 ­­
  16. ; ­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­
  17. ; ­­                                                                 ­­
  18. ; ­­ This program may be freely  distributed if you don't  gain  any ­­
  19. ; ­­ profit by using and/or distributing it.                         ­­
  20. ; ­­                                                                 ­­
  21. ; ­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­
  22. ; ­­    This program is pc relative and 100% PURE (set P flag)       ­­
  23. ; ­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­
  24.  
  25.  
  26.     incdir    "ram:include/"
  27.  
  28.     include    "exec/exec_lib.i"
  29.     include    "exec/memory.i"
  30.     include    "intuition/intuition_Lib.i"
  31.     include    "intuition/intuition.i"
  32.     include    "libraries/dos.i"
  33.     include    "libraries/dos_lib.i"
  34.     include    "libraries/dosextens.i"
  35.  
  36.  
  37. ; ­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­
  38. ; ­­                              Macros                             ­­
  39. ; ­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­
  40.  
  41.  
  42. DOS    macro            ; die alten Macros müssen ersetzt
  43.     move.l    Var_DOS(a5),a6        ; werden, da ja die Library-Bases
  44.     jsr    _LVO\1(a6)        ; an anderer Stelle vermerkt werden.
  45.     endm
  46.  
  47. INT    macro
  48.     move.l    Var_INT(a5),a6
  49.     jsr    _LVO\1(a6)
  50.     endm
  51.     
  52.  
  53.  
  54. ; ­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­
  55. ; ­­                          Variablen                              ­­
  56. ; ­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­
  57.  
  58.     rsreset
  59. Var_DOS    rs.l    1        ; DOSBase
  60. Var_INT    rs.l    1        ; IntuitionBase
  61. Var_Parameter    rs.l    1        ; Zeiger auf Paramterstring
  62. Var_X    rs.w    1        ; X-Ordinate
  63. Var_Y    rs.w    1        ; Y-Ordinate
  64. Var_Width    rs.w    1        ; Breite
  65. Var_Height    rs.w    1        ; Höhe
  66. Var_Window    rs.l    1        ; Zeiger aufs Window
  67.  
  68. Var_SIZEOF    rs.b    0
  69.  
  70.  
  71. ; ­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­
  72. ; ­­                 Variablenspeicherplatz belegen                  ­­
  73. ; ­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­
  74. ; ­­ Diese Routine belegt den Speicherplatz für die zuvor  bestimmte ­­
  75. ; ­­ Variablenliste. Bei einem Fehler wird  das anschließende Haupt- ­­
  76. ; ­­ programm nicht gestartet.                                       ­­
  77. ; ­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­
  78.  
  79.  
  80. _main    clr.b    -1(a0,d0)        ; Paramterstring mit $00 terminieren
  81.     move.l    a0,a4
  82.     moveq.l    #Var_SIZEOF,d0        ; Variablenspeicher
  83.     move.l    #MEMF_CLEAR+MEMF_PUBLIC,d1    ; belegen
  84.     CALLEXEC    AllocMem
  85.     tst.l    d0
  86.     beq.s    .Fehler        ; Fehler !
  87.     move.l    d0,a5
  88.     move.l    a4,Var_Parameter(a5)
  89.     bsr    .Programm        : ins Hauptprogramm
  90. .Label1    move.l    d0,-(sp)
  91.     move.l    a5,a1
  92.     moveq.l    #Var_SIZEOF,d0
  93.     CALLEXEC    FreeMem        ; Variablenspeicher freigeben
  94.     move.l    (sp)+,d0
  95.     rts
  96. .Fehler    moveq.l    #20,d0        ; fataler Fehler !
  97.     bra.s    .Label1
  98. .Programm
  99.  
  100. ; ­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­
  101. ; ­­                       Hauptprogramm                             ­­
  102. ; ­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­
  103.  
  104. MAIN    bsr    GetLibs        ; DOS- und Intuition-Library öffnen
  105.     tst.l    d0        ; Fehler
  106.     beq    .Fehler
  107.     bsr    CLIWindow        ; Zeiger auf CLI-Window
  108.     lea.l    .Text1(pc),a0
  109.     tst.l    d0
  110.     beq    .PrintText
  111.     move.l    d0,Var_Window(a5)    ; Zeiger merken
  112.  
  113.     move.l    d0,a0
  114.     move.w    wd_LeftEdge(a0),Var_X(a5)    ; aktuelle Windowerte als Voreinstellung
  115.     move.w    wd_TopEdge(a0),Var_Y(a5)    ; kopieren
  116.     move.w    wd_Width(a0),Var_Width(a5)
  117.     move.w    wd_Height(a0),Var_Height(a5)
  118.  
  119.  
  120.     move.l    Var_Parameter(a5),a0    ; X-Ordinate holen
  121.     move.l    a0,a1
  122.     cmp.b    #"?",(a0)
  123.     beq    .INFO        ; Info-String ausgeben
  124.     cmp.b    #"*",(a1)+        ; aktuellen Wert übernehmen ?
  125.     beq.s    .Label1
  126.     subq.l    #1,a1        ; A0 wieder um eins vermindern
  127.     bsr    GetLong
  128.     move.l    a0,a1        ; Zeiger auf nächstes Argument
  129.     lea.l    .Text2(pc),a0
  130.     tst.l    d1        ; Fehler ?
  131.     bne    .PrintText        ; Fehlermeldung ausgeben
  132.     move.w    d0,Var_X(a5)
  133. .Label1    cmp.b    #"/",(a1)+        ; "/"-Zeichen ?
  134.     bne    .PrintText
  135.  
  136.     move.l    a1,a0        ; Y-Ordinate holen
  137.     cmp.b    #"*",(a1)+        ; aktuellen Wert übernehmen ?
  138.     beq.s    .Label2
  139.     subq.l    #1,a1        ; A0 wieder um eins vermindern
  140.     bsr    GetLong
  141.     move.l    a0,a1        ; Zeiger auf nächstes Argument
  142.     lea.l    .Text2(pc),a0
  143.     tst.l    d1        ; Fehler ?
  144.     bne    .PrintText        ; Fehlermeldung ausgeben
  145.     move.w    d0,Var_Y(a5)
  146. .Label2    cmp.b    #"/",(a1)+        ; "/"-Zeichen ?
  147.     bne    .PrintText
  148.  
  149.     move.l    a1,a0        ; Breite holen
  150.     cmp.b    #"*",(a1)+        ; aktuellen Wert übernehmen ?
  151.     beq.s    .Label3
  152.     subq.l    #1,a1        ; A0 wieder um eins vermindern
  153.     bsr    GetLong
  154.     move.l    a0,a1        ; Zeiger auf nächstes Argument
  155.     lea.l    .Text2(pc),a0
  156.     tst.l    d1        ; Fehler ?
  157.     bne    .PrintText        ; Fehlermeldung ausgeben
  158.     move.w    d0,Var_Width(a5)
  159. .Label3    cmp.b    #"/",(a1)+        ; "/"-Zeichen ?
  160.     bne    .PrintText
  161.  
  162.     move.l    a1,a0        ; Höhe holen
  163.     cmp.b    #"*",(a1)+        ; aktuellen Wert übernehmen ?
  164.     beq.s    .Label12
  165.     subq.l    #1,a1        ; A0 wieder um eins vermindern
  166.     bsr    GetLong
  167.     move.l    a0,a1        ; Zeiger auf nächstes Argument
  168.     lea.l    .Text2(pc),a0
  169.     tst.l    d1        ; Fehler ?
  170.     bne    .PrintText        ; Fehlermeldung ausgeben
  171.     move.w    d0,Var_Height(a5)
  172.  
  173.  
  174. .Label12    CALLEXEC    Forbid        ; kein anderer Task darf das Window jetzt verschieben !
  175.     move.l    Var_Window(a5),a0    ; Window-Zeiger
  176.     move.l    wd_WScreen(a0),a1    ; Screen-Zeiger
  177.  
  178.     move.w    Var_Width(a5),d0
  179.     cmp.w    #0,d0        ; Ist die Breite >0 ?
  180.     bgt.s    .Label10        ; wenn ja, verzweige
  181.     add.w    sc_Width(a1),d0    ; sonst : echte Breite = Breite + Screen_Breite - Window_X
  182.     sub.w    Var_X(a5),d0
  183.     move.w    d0,Var_Width(a5)
  184. .Label10    move.w    Var_Height(a5),d0
  185.     cmp.w    #0,d0        ; Ist die Höhe >0 ?
  186.     bgt.s    .Label11        ; wenn ja, verzweige
  187.     add.w    sc_Height(a1),d0    ; sonst : echte Höhe = Höhe + Screen_Höhe - Window_Y
  188.     sub.w    Var_Y(a5),d0
  189.     move.w    d0,Var_Height(a5)
  190. .Label11
  191.  
  192.     move.w    Var_Width(a5),d0
  193.     cmp.w    wd_MaxWidth(a0),d0    ; Gewünschte Breite größer als erlaubte ?
  194.     bls.s    .Label6
  195.     move.w    wd_MaxWidth(a0),d0    ; erlaubte Breite
  196. .Label6    cmp.w    wd_MinWidth(a0),d0    ; Gewünschte Breite kleiner als erlaubte ?
  197.     bhi.s    .Label7
  198.     move.w    wd_MinWidth(a0),d0    ; erlaubte Breite
  199. .Label7    move.w    d0,Var_Width(a5)
  200.  
  201.  
  202.     move.w    Var_Height(a5),d0
  203.     cmp.w    wd_MaxHeight(a0),d0    ; Gewünschte Höhe größer als erlaubte ?
  204.     bls.s    .Label8
  205.     move.w    wd_MaxHeight(a0),d0
  206. .Label8    cmp.w    wd_MinHeight(a0),d0    ; Gewünschte Höhe kleiner als erlaubte ?
  207.     bhi.s    .Label9
  208.     move.w    wd_MinHeight(a0),d0    ; erlaubte Höhe
  209. .Label9    move.w    d0,Var_Height(a5)
  210.  
  211.  
  212.     move.l    wd_WScreen(a0),a0    ; Zeiger auf zugehörigen Screen
  213.  
  214.     move.w    Var_X(a5),d0        ; X2 bestimmen
  215.     add.w    Var_Width(a5),d0
  216.     move.w    Var_Y(a5),d1        ; Y2 bestimmen
  217.     add.w    Var_Height(a5),d1
  218.  
  219.     cmp.w    sc_Width(a0),d0    ; X2> Windowbreite ?
  220.     bls.s    .Label4
  221.     CALLEXEC    Permit        ; Fehler !
  222.     lea.l    .Text3(pc),a0
  223.     bra    .PrintText
  224. .Label4    cmp.w    sc_Height(a0),d1    ; Y2> Windowhöhe ?
  225.     bls.s    .Label5
  226.     CALLEXEC    Permit        ; Fehler !
  227.     lea.l    .Text3(pc),a0
  228.     bra    .PrintText
  229.  
  230.  
  231. .Label5    move.l    Var_Window(a5),a0    ; zunächst Window-Position verändern
  232.     move.w    Var_X(a5),d0        ; DeltaX = neue_X_Ordinate - X_Ordinate_Window
  233.     move.w    Var_Y(a5),d1        ; DeltaY = neue_Y_Ordinate - Y_Ordinate_Window
  234.     sub.w    wd_LeftEdge(a0),d0
  235.     sub.w    wd_TopEdge(a0),d1
  236.     INT    MoveWindow
  237.  
  238.     move.l    Var_Window(a5),a0    ; jetzt die Window-Größe verändern
  239.     move.w    Var_Width(a5),d0    ; DeltaX = neue_Breite - alte_Breite
  240.     move.w    Var_Height(a5),d1    ; DeltaY = neue_Höhe   - alte_Höhe
  241.     sub.w    wd_Width(a0),d0
  242.     sub.w    wd_Height(a0),d1
  243.     INT    SizeWindow
  244.  
  245.     CALLEXEC    Permit        ; das war's !
  246.     lea.l    .NewSize(pc),a0    ; das CLI/die SHELL soll die neuen Ausmaße übernehmen !
  247.     bsr    CLIText
  248.  
  249.  
  250.     bsr    CloseLibs        ; zuvor geöffnete Libraries schließen
  251.     moveq.l    #0,d0        ; kein Fehler !
  252.     rts
  253.  
  254. .Fehler    bsr    CloseLibs        ; zuvor geöffnete Libraries schließen
  255.     moveq.l    #20,d0        ; fataler Fehler !
  256.     rts
  257.  
  258. .PrintText    bsr    CLIText        ; Fehlermeldung ausgeben
  259.     bsr    CloseLibs        ; zuvor geöffnete Libraries schließen
  260.     moveq.l    #0,d0
  261.     rts
  262.  
  263. .INFO    lea.l    .InfoString(pc),a0    ; "?"-Funktion
  264.     bra.s    .PrintText
  265.  
  266. .Text1    dc.b    "Can't get window pointer !",10,0
  267.     even
  268. .Text2    dc.b    "Sytax error !",10,0
  269.     even
  270. .Text3    dc.b    "Check screen size !",10,0
  271.     even
  272. .NewSize    dc.b    $9b,"t",$9b,"u",0
  273.     even
  274. .InfoString    dc.b    10," ",$9b,"4m"
  275.     dc.b    "            CLIwindow V1.00    © 12/1990 Roger Fischlin            "
  276.     dc.b    $9b,"0m",10,10
  277.     dc.b    " CLIwindow may be freely  distributed  if you  don't gain  an profit",10
  278.     dc.b    " by using and/or distributing it.CLIwindow will move this CLI window",10
  279.     dc.b    " and change its size.",10,10
  280.     dc.b    " Usage : CLIwindow x/y/width/height",10,10
  281.     dc.b    " use '*' for current data. CLIwindow will check MinWidth & MinHeight",10
  282.     dc.b    " and MaxWidth & MaxHeight. It also takes  care of the  screen  size.",10
  283.     dc.b    " You may use hexadecimal numbers, too. If Width od Height are bellow",10
  284.     dc.b    " 1 then they are taken as X2 oder Y2  relative to the  screen size .",10
  285.     dc.b    " For example 'CLIwindow 0/0/0/0' will use  the  whole screen size or",10
  286.     dc.b    " 'CLIwindow 0/0/-10/0' will leave ten rows free.",10
  287.     dc.b    10,0
  288.  
  289. ; ­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­
  290. ; ­­                           GetLibs                               ­­
  291. ; ­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­
  292. ; ­­ GetLibs öffnet  die  DOS-  und  die  Intuition-Library ab Kick- ­­
  293. ; ­­ start 1.2 . Tritt ein Fehler auf, so enthält D0 0.              ­­
  294. ; ­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­
  295.  
  296. GetLibs    lea.l    IntName(pc),a1        ; Intuition-Library
  297.     moveq.l    #33,d0        ; ab Kickstart 1.2
  298.     CALLEXEC    OpenLibrary        ; öffnen
  299.     move.l    d0,Var_INT(a5)
  300.     beq.s    .Error
  301.     lea.l    DosName(pc),a1        ; DOS-Library
  302.     moveq.l    #33,d0        ; ab Kickstart 1.2
  303.     CALLEXEC    OpenLibrary        ; öffnen
  304.     move.l    d0,Var_DOS(a5)
  305. .Error    rts
  306.  
  307. IntName    INTNAME            ; Library-Namen
  308. DosName    DOSNAME
  309.  
  310. ; ­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­
  311. ; ­­                          CloseLibs                              ­­
  312. ; ­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­
  313. ; ­­ CloseLibs schließt die von OpenLibs geöffneten Libraries, nicht ­­
  314. ; ­­ geöffnete Libraries werden abgefangen.                          ­­
  315. ; ­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­
  316.  
  317. CloseLibs    move.l    d2,-(sp)        ; D2 retten
  318.     moveq.l    #0,d2        ; D2 als $0000000-Vergleich
  319.     move.l    Var_INT(a5),a1        ; Intuition-Library schließen
  320.     cmp.l    a0,d2        ; Wurde sie überhaupt geöffnet ?
  321.     beq.s    .Skip1
  322.     CALLEXEC    CloseLibrary
  323. .Skip1    move.l    Var_DOS(a5),a1        ; DOS-Library schließen
  324.     cmp.l    a0,d2        ; Wurde sie überhaupt geöffnet ?
  325.     beq.s    .Skip2
  326.     CALLEXEC    CloseLibrary
  327. .Skip2    move.l    (sp)+,d2
  328.     rts
  329.  
  330. ; ­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­
  331. ; ­­                           CLIWindow                             ­­
  332. ; ­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­
  333. ; ­­ CLIWindow ermittelt den Zeiger auf das Fenster  des CLIs, bzw.  ­­
  334. ; ­­ liefet 0 bei einem Fehler.                                      ­­
  335. ; ­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­
  336.  
  337.  
  338. CLIWindow    movem.l    a2-a5,-(sp)        ; Register retten
  339.     sub.l    a1,a1
  340.     CALLEXEC    FindTask        ; Zeiger auf eigenen Task
  341.     move.l    d0,a0
  342.     move.l    pr_ConsoleTask(a0),a2    ; ID der zugehörigen Console
  343.  
  344.     sub.l    a0,a0        ; Reply-Port erzeugen
  345.     moveq.l    #0,d0
  346.     bsr    CreatePort
  347.     tst.l    d0        ; Fehler ?
  348.     beq    .Label1
  349.     move.l    d0,a3        ; Zeiger auf Reply-Port retten
  350.  
  351.     bsr    CreatePacket        ; StandardPacket erzeugen
  352.     tst.l    d0        ; Fehler ?
  353.     beq.s    .Label2
  354.     move.l    d0,a4
  355.     move.l    a3,sp_Pkt+dp_Port(a4)    ; Reply-Port eintragen
  356.  
  357.     moveq.l    #id_SIZEOF,d0        ; Speicher für InfoData reservieren
  358.     move.l    #MEMF_PUBLIC!MEMF_CLEAR,d1
  359.     CALLEXEC    AllocMem
  360.     tst.l    d0
  361.     beq.s    .Label3
  362.     move.l    d0,a5
  363.  
  364.     lsr.l    #2,d0        ; id-Zeiger in BCPL-Zeiger umwandeln
  365.     move.l    d0,sp_Pkt+dp_Arg1(a4)    ; und ins DosPacket eintragen
  366.     move.l    #ACTION_DISK_INFO,sp_Pkt+dp_Type(a4)    
  367.  
  368.     move.l    a4,a1        ; Zeiger auf Packet
  369.     move.l    a2,a0        ; Zeiger auf Port
  370.     CALLEXEC    PutMsg
  371.  
  372. .Label5    move.l    a3,a0        ; auf Reply warten
  373.     CALLEXEC    WaitPort    
  374.  
  375.     move.l    a3,a0        ; Reply-Message holen
  376.     CALLEXEC    GetMsg
  377.     tst.l    d0        ; doch keine Message ?
  378.     beq.s    .Label5
  379.     
  380.     move.l    id_VolumeNode(a5),d0    ; WindowPointer !
  381.  
  382. .Label4    move.l    d0,-(sp)
  383.     move.l    a5,a1        ; Speicher für InfoData 
  384.     moveq.l    #id_SIZEOF,d0        ; freigeben
  385.     CALLEXEC    FreeMem
  386.     move.l    (sp)+,d0
  387.  
  388. .Label3    move.l    d0,-(sp)
  389.     move.l    a4,a0
  390.     bsr    DeletePacket        ; Standard-Packet löschen
  391.     move.l    (sp)+,d0
  392.  
  393. .Label2    move.l    d0,-(sp)
  394.     move.l    a3,a0
  395.     bsr    DeletePort        ; Reply-Port löschen
  396.     move.l    (sp)+,d0
  397.  
  398. .Label1    movem.l    (sp)+,a2-a5
  399.     rts
  400.  
  401.  
  402. ; ­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­
  403. ; ­­                           CreatePacket                          ­­
  404. ; ­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­
  405. ; ­­ CreatePacket erzeugt ein StandardPacket,Message- und DosPacket- ­­
  406. ; ­­ Teil werden verbunden. In d0/a0 wird er Zeiger zurückgeben,bzw. ­­
  407. ; ­­ 0 bei einen Fehler.                                             ­­
  408. ; ­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­
  409.  
  410.  
  411. CreatePacket    moveq.l    #sp_SIZEOF,d0        ; Speicher für StandardPacket reservieren
  412.     move.l    #MEMF_PUBLIC!MEMF_CLEAR,d1
  413.     CALLEXEC    AllocMem
  414.     tst.l    d0
  415.     beq.s    .Label1
  416.     move.l    d0,a0    
  417.     lea.l    sp_Pkt(a0),a1        ; Zeiger auf Packet-Teil
  418.     move.l    a1,sp_Msg+LN_NAME(a0)    ; Node-Namen muß auf Packet-Teil zeigen
  419.     move.l    a0,sp_Pkt+dp_Link(a0)    ; DosPacket-Link muß auf Message-Teil zeigen
  420. .Label1    rts    
  421.  
  422. ; ­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­
  423. ; ­­                           DeletePacket                          ­­
  424. ; ­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­
  425. ; ­­ DeletePacket  löscht ein   zuvor   mit  CreatePacket  erzeugtes ­­
  426. ; ­­ StandardPacket. Als Parameter  wird  in A0 der  Zeiger auf  das ­­
  427. ; ­­ StandardPacket erwartet.                                        ­­
  428. ; ­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­
  429.  
  430. DeletePacket    moveq.l    #0,d0
  431.     cmp.l    d0,a0        ; 0-Zeiger abfangen !
  432.     beq.s    .NIL
  433.     move.l    a0,a1
  434.     moveq.l    #sp_SIZEOF,d0        ; Speicher freigeben
  435.     CALLEXEC    FreeMem
  436. .NIL    rts
  437.  
  438.  
  439. ; ­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­
  440. ; ­­                          CreatePort                             ­­
  441. ; ­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­
  442. ; ­­ CreatePort erzeugt einen  funktionsfähigen   Msg-Port  des Typs ­­
  443. ; ­­ PA_SIGNAL mit der Priorität von D0.A0 zeigt auf den Port-Namen, ­­
  444. ; ­­ der nicht kopiert  wird. Falls A0 0  ist, wird er nicht in  die ­­
  445. ; ­­ Liste öffentlicher  Ports   aufgenommen.  Als SigTask wird  der ­­
  446. ; ­­ eigene eingetragen. Der Funktionswert in D0 ist  der Zeiger auf ­­
  447. ; ­­ auf den Port oder bei einem Fehler 0 .                          ­­
  448. ; ­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­
  449.  
  450.  
  451. CreatePort    move.l    a2,-(sp)
  452.     movem.l    d0/a0,-(sp)        ; retten
  453.     moveq.l    #MP_SIZE,d0        ; Speicher für Port reservieren
  454.     move.l    #MEMF_PUBLIC!MEMF_CLEAR,d1
  455.     CALLEXEC    AllocMem
  456.     tst.l    d0
  457.     beq.s    .NoMem
  458.     move.l    d0,a2
  459.     moveq.l    #-1,d0        ; Signal belegen
  460.     CALLEXEC    AllocSignal
  461.     move.b    d0,MP_SIGBIT(a2)
  462.     bmi.s    .FreeMem        ; kein Signal 
  463.     movem.l    (sp)+,d0/a0
  464.     move.b    d0,MP+LN_PRI(a2)    ; Priorität eintragen
  465.     move.b    #NT_MSGPORT,LN_TYPE(a2)
  466.     move.l    a0,MP+LN_NAME(a2)    ; Name
  467.     sub.l    a1,a1
  468.     CALLEXEC    FindTask
  469.     move.l    d0,MP_SIGTASK(a2)    ; eigener Task als Signal-Empfänger
  470.     lea.l    MP_MSGLIST(a2),a0
  471.     move.b    #NT_MESSAGE,LH_TYPE(a0)    ; Messages werden verwaltet
  472.     bsr    NewList
  473.     tst.l    MP+LN_NAME(a2)        ; öffentlicher Port ?
  474.     beq.s    .Private
  475.     move.l    a2,a1
  476.     CALLEXEC    AddPort        ; Port in allgemeine Liste eintragen
  477. .Private    move.l    a2,d0
  478.     move.l    (sp)+,a2
  479.     rts
  480.  
  481. .FreeMem    move.l    a2,a1
  482.     moveq.l    #MP_SIZE,d0        ; Speicher freigeben
  483.     CALLEXEC    FreeMem
  484. .NoMem    addq.l    #8,sp
  485.     move.l    (sp)+,a2
  486.     moveq.l    #0,d0        ; Fehler !
  487.     rts
  488.  
  489. ; ­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­
  490. ; ­­                            NewList                              ­­
  491. ; ­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­
  492. ; ­­ NewList initialisiert eine LIST-Struktur, A0 muß auf die LIST-  ­­
  493. ; ­­ Struktur zeigen.                                                ­­
  494. ; ­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­
  495.  
  496. NewList    move.l    a0,LH_HEAD(a0)        ; LH_HEAD muß auf LH_TAIL zeigen
  497.     addq.l    #LH_TAIL,(a0)
  498.     clr.l    LH_TAIL(a0)        ; LH_TAIL muß auf  0 zeigen
  499.     move.l    a0,LH_TAILPRED(a0)
  500.     rts
  501.  
  502. ; ­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­
  503. ; ­­                         DeletePort                              ­­
  504. ; ­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­
  505. ; ­­ DeletePort löscht einen zuvor mit CreatePort erzeugten MsgPort. ­­
  506. ; ­­ Als Parameter wird in A0 der Zeiger auf den Port erwartet.Noch  ­­
  507. ; ­­ ausstehende Messages werden zuvor reply-t.                      ­­
  508. ; ­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­
  509.  
  510. DeletePort    move.l    a2,-(sp)
  511.     move.l    a0,a2        ; Zeiger retten
  512.     CALLEXEC    Forbid        ; Multitasking unterbinden
  513. .Loop    move.l    a2,a0
  514.     CALLEXEC    GetMsg        ; Msg holen
  515.     tst.l    d0        ; keine (weitere) Message mehr
  516.     beq.s    .AllReplied
  517.     move.l    d0,a1
  518.     CALLEXEC    ReplyMsg        ; Message reply-en
  519.     bra.s    .Loop
  520. .AllReplied    move.l    MP+LN_NAME(a2),d0    ; öffentlicher Port ?
  521.     beq.s    .Private
  522.     move.l    a2,a1
  523.     CALLEXEC    RemPort        ; entfernen
  524. .Private    move.b    MP_SIGBIT(a2),d0
  525.     CALLEXEC    FreeSignal        ; Signal freigeben
  526.     move.l    a2,a1        ; Speicher freigeben
  527.     moveq.l    #MP_SIZE,d0
  528.     CALLEXEC    FreeMem
  529.     CALLEXEC    Permit        ; Multitasking wieder erlauben
  530.     move.l    (sp)+,a2
  531.     rts
  532.  
  533. ; ­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­
  534. ; ­­                           CLIText                               ­­
  535. ; ­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­
  536. ; ­­ CLIText gibt den mit einem $00-Byte  abgeschlossen Text (Zeiger ­­
  537. ; ­­ in A0) im CLI-Window aus.                                       ­­
  538. ; ­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­
  539.  
  540. CLIText    movem.l    d2/d3,-(sp)        ; Register retten
  541.     move.l    a0,d2        ; Zeiger nach D2
  542.     moveq.l    #-1,d3        ; Länge ermitteln
  543. .Label    addq.l    #1,d3
  544.     tst.b    (a0)+
  545.     bne.s    .Label
  546.     DOS    Output        ; Handle fürs CLI-Fenster
  547.     move.l    d0,d1
  548.     DOS    Write        ; Text ausgeben
  549.     movem.l    (sp)+,d2/d3
  550.     rts
  551.  
  552. ; ­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­
  553. ; ­­                          GetLong                                ­­
  554. ; ­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­
  555. ; ­­ GetLong übersetzt den ASCII-String (Zeiger in A0)  in ein Long- ­­
  556. ; ­­ Word, welches in D0 zurückgeben wird. Anschließend zeigt A0 auf ­­                                                      ­­
  557. ; ­­ das erste Zeichen nach der Zalh im String.  Enthält D1  0, trat ­­
  558. ; ­­ kein Fehler auf. 1 signalisiert einen Überlauf, -1 zeigt  einen ­­
  559. ; ­­ Fehler im Aufbau  an. Unterstützt werden  das  dezimale und das ­­
  560. ; ­­ hexadezimale ("$")  Zahlensystem.                               ­­
  561. ; ­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­
  562.  
  563. GetLong    movem.l    d3-d3/a1-a3,-(sp)    ; Register retten
  564.     bsr.s    .Main
  565.     movem.l    (sp)+,d3-d3/a1-a3
  566.     rts
  567.  
  568. .Main    moveq.l    #0,d0        ; Register löschen
  569.     moveq.l    #0,d1
  570.     moveq.l    #0,d2
  571. .Label1    move.b    (a0)+,d3        ; Spaces und Tabs überlesen
  572.     cmp.b    #" ",d3
  573.     beq.s    .Label1
  574.     cmp.b    #9,d3
  575.     beq.s    .Label1
  576.  
  577.     cmp.b    #"$",d3        ; hexadezimal ?
  578.     beq    .Hex
  579.     cmp.b    #"-",d3        ; negativ ?
  580.     beq.s    .Negativ
  581.     cmp.b    #"9",d3        ; Ziffer ?
  582.     bhi    .Fehler
  583.     cmp.b    #"0"-1,d3
  584.     bhi    .Dezimal
  585.  
  586. .Fehler    subq.l    #1,a0        ; ^Fehler
  587.     moveq.l    #-1,d1        ; Fehlercode
  588.     rts
  589.  
  590. .Negativ    tst.b    d2        ; teste,ob bereits ein "-"
  591.     bne.s    .Fehler
  592.     moveq.l    #1,d2        ; Flag für negativ seten
  593.     bra    .Label1
  594.  
  595.  
  596.  
  597.  
  598. .Dezimal    subq.l    #1,a0        ; A0 auf erste Ziffer setzen
  599.     move.l    a0,a1        ; A1 ^erstes Ziffer
  600. .Label_D2    move.b    (a0)+,d3        ; nächste Zeiffer holen 
  601.     cmp.b    #"9",d3        ; wiederhole, bis Zahlenende
  602.     bhi.s    .Label_D3        ; erreicht wird.
  603.     cmp.b    #"0"-1,d3
  604.     bhi.s    .Label_D2
  605.  
  606. .Label_D3    lea.l    .Data10(pc),a2        ; Zeiger auf 10'er-Potenzen
  607.     subq.l    #1,a0        ; A0 ^letzte Ziffer+1
  608.     move.l    a0,a3        ; A3 ^letzte Ziffer+1 
  609.  
  610. .Label_D5    move.l    (a2)+,d4        ; Stellenzahl holen
  611.     beq.s    .Overflow        ; Longwordgrenze überschritten ?
  612.     moveq.l    #0,d3        ; D3 löschen
  613.     move.b    -(a3),d3        ; vorherige Ziffer holen
  614.     sub.b    #"0"+1,d3        ; und in Zahl umwandeln (1 abziehen wegen DBRA-Schleife)
  615.     bmi.s    .D_Zero        ; Ziffer "0" abfangen
  616. .Label_D4    add.l    d4,d0        ; Stellenzahl so oft wie Ziffer addieren
  617.     dbra    d3,.Label_D4
  618. .D_Zero    cmp.l    a3,a1        ; Zahlenanfang erreicht ?
  619.     bne.s    .Label_D5
  620.  
  621. .Vorzeichen    tst.b    d2        ; negatives Vorzeichen ?
  622.     beq.s    .NotNegative
  623.     tst.l    d0        ; Ist die Zahl größer als ein Longint ?
  624.     bmi    .Overflow
  625.     neg.l    d0        ; negativieren
  626. .NotNegative    moveq.l    #0,d1        ; keine Fehler
  627.     rts
  628.  
  629. .Data10    dc.l    1
  630.     dc.l    10
  631.     dc.l    100
  632.     dc.l    1000
  633.     dc.l    10000
  634.     dc.l    100000
  635.     dc.l    1000000
  636.     dc.l    10000000
  637.     dc.l    100000000
  638.     dc.l    1000000000
  639.     dc.l    0
  640.  
  641. .Overflow    moveq.l    #1,d1        ; Überfluß (Zahl zu groß !)
  642.     rts
  643.         
  644.  
  645.  
  646.  
  647.  
  648. .Hex    move.b    (a0)+,d3        ; erste Stelle OK ?
  649.     bsr.s    .Nibble
  650.     bmi    .Fehler        ; Fehler !
  651.  
  652.  
  653.     lea.l    -1(a0),a1        ; A1 ^ erste Ziffer
  654. .Label_H2    move.b    (a0)+,d3
  655.     bsr.s    .Nibble        ; in Hexa-Ziffer übersetzen 
  656.     bpl.s    .Label_H2
  657.     subq.l    #1,a0        ; A0 ^letzte Ziffer+1
  658.     move.l    a0,a2        ; A2 ^letzte Ziffer+1
  659.     moveq.l    #0,d1
  660. .Label_H3    move.b    -(a2),d3        ; vorherige Ziffer
  661.     bsr    .Nibble
  662.     lsl.l    d1,d4        ; Nibble an richtige Position schieben
  663.     add.l    d4,d0        ; zum Ergebnis addieren
  664.     addq.l    #4,d1
  665.     cmp.b    #32,d1        ; 32. Bit erreicht ?
  666.     bhi    .Overflow        ; wenn ja, Overflow !
  667.     cmp.l    a2,a1        ; Zahlenanfang erreicht ?
  668.     bne.s    .Label_H3
  669.     bra    .Vorzeichen
  670.  
  671. .Nibble    moveq.l    #0,d4
  672.     cmp.b    #"a"-1,d3        ; Ziffer d3 -> Zahl d4
  673.     bls.s    .N1        ; Upcase
  674.     cmp.b    #"f",d3
  675.     bhi.s    .N_Error
  676.     sub.b    #"a"-"A",d3
  677. .N1    sub.b    #"0",d3
  678.     cmp.b    #9,d3        ; Ziffer ?
  679.     bls.s    .Ziffer
  680.     sub.b    #"@"-"9",d3        ; Buchstabe
  681.     cmp.b    #$f,d3
  682.     bhi.s    .N_Error
  683. .Ziffer    move.b    d3,d4
  684.     rts
  685. .N_Error    moveq.l    #-1,d4        ; Fehler !
  686.     rts
  687.     
  688.  
  689.  
  690.